package insert;

import java.io.IOException;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.sql.DataSource;

import ressource.CadreAnnonce;
import ressource.CadreProduit;
import ressource.CadreVendeur;
import ressource.CadreVente;

/**
 * Servlet implementation class ValideAnnonce
 */
public class ValideVente extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public ValideVente() {
        super();
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		HttpSession session = request.getSession();
		RequestDispatcher dis;
		Connection con = null;
		Context namingContext = null;
		DataSource dataSource = null;
		Integer idVente = Integer.parseInt(request.getParameter("vente"));
		//Si on n'a pas d'annonce, alors on dégage !
		if(idVente == null) {
			System.out.println("pas de vente");
			response.sendRedirect("home");
			return;
		} else {
			//Sinon on prend les informations sur la vente :
			try {
				//COnnexion à la bdd :
				namingContext = new InitialContext();
				dataSource = (DataSource)namingContext.lookup("java:comp/env/jdbc/MiniIBay");
				con = dataSource.getConnection();
				
				//Quelles sont les informations sur la vente ?
				PreparedStatement testStock=con.prepareStatement("SELECT a.id_vendeur, v.stock, v.prix, v.id_acheteur, v.date, m.pseudo, m.avatar, p.intitule, p.description, p.photo, t.nom as type, a.etat, a.date_expiration FROM vente v, membre m, annonce a, produit p, type_produit t WHERE id_vente = ? AND a.id_annonce = v.id_annonce AND m.id_membre = a.id_vendeur AND a.id_produit = p.id_produit AND t.id_type = p.id_type");
				testStock.setInt(1, idVente);
				ResultSet rs = testStock.executeQuery();
				rs.next();
				//Si l'utilisateur n'est pas l'acheteur, il n'a rien à faire ici :
				if(rs.getInt("id_acheteur") == (Integer)session.getAttribute("user_id")) {
					Integer stock = rs.getInt("stock");
					Integer prix = rs.getInt("prix");
					Integer idVendeur = rs.getInt("id_vendeur");
					String pseudoVendeur = rs.getString("pseudo");
					String avatar = rs.getString("avatar");
					Date date = rs.getDate("date");
					String nomProduit = rs.getString("intitule");
					String descriptionProduit = rs.getString("description");
					String photoProduit = rs.getString("photo");
					String type = rs.getString("type");
					String etat = rs.getString("etat");
					Date date_expiration = rs.getDate("date_expiration");
					testStock.close();
					
					//On affecte nos éléments :
					CadreVente vente = new CadreVente();
					vente.setIdVente(idVente);
					vente.setStock(stock);
					vente.setPrix(prix);
					vente.setDate(date);
					request.setAttribute("vente", vente);
	
					CadreVendeur vendeur = new CadreVendeur();
					vendeur.setIdVendeur(idVendeur);
					vendeur.setPseudo(pseudoVendeur);
					vendeur.setAvatar(avatar);
					request.setAttribute("vendeur", vendeur);
					
					CadreProduit produit = new CadreProduit();
					produit.setDescription(descriptionProduit);
					produit.setIntitule(nomProduit);
					produit.setPhoto(photoProduit);
					request.setAttribute("produit", produit);
					
					CadreAnnonce annonce = new CadreAnnonce();
					annonce.setDateExpiration(date_expiration);
					annonce.setEtat(etat);
					request.setAttribute("annonce", annonce);
				} else {
					System.out.println("mauvais membre : "+session.getAttribute("user_id")+" | "+rs.getString("id_acheteur"));
					response.sendRedirect("home");
					return;
				}
			} catch (SQLException e) {
				e.printStackTrace();
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				try {
					con.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
		
		//Et on charge notre jsp :
		dis=request.getRequestDispatcher("valide_vente.jsp");
		dis.forward(request,response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		HttpSession session = request.getSession();
		RequestDispatcher dis;
		Connection con = null;
		Context namingContext = null;
		DataSource dataSource = null;
		Integer idVente = Integer.parseInt(request.getParameter("vente"));
		//Si on n'a pas d'annonce, alors on dégage !
		if(idVente == null) {
			System.out.println("pas de vente");
			response.sendRedirect("home");
			return;
		} else {
			//Sinon on prend les informations sur la vente :
			try {
				//COnnexion à la bdd :
				namingContext = new InitialContext();
				dataSource = (DataSource)namingContext.lookup("java:comp/env/jdbc/MiniIBay");
				con = dataSource.getConnection();
				
				//Quelles sont les informations sur la vente ?
				PreparedStatement testStock=con.prepareStatement("SELECT v.id_acheteur FROM vente v WHERE id_vente = ?");
				testStock.setInt(1, idVente);
				ResultSet rs = testStock.executeQuery();
				rs.next();
				//Si l'utilisateur n'est pas l'acheteur, il n'a rien à faire ici :
				if(rs.getInt("id_acheteur") == (Integer)session.getAttribute("user_id")) {
					//L'utilisateur a validé le formulaire, rentrons donc les informations
					String requete = "UPDATE vente SET note = ?, commentaire = ? WHERE id_vente = ?";
					PreparedStatement updateVente =con.prepareStatement(requete);
					updateVente.setString(1, request.getParameter("note"));
					updateVente.setString(2, request.getParameter("commentaire"));
					updateVente.setInt(3, idVente);
					updateVente.executeUpdate();
					
					requete = "SELECT AVG(note) AS vnote, id_vendeur FROM vente v, annonce a WHERE a.id_vendeur = (SELECT a.id_vendeur FROM annonce a, vente v WHERE id_vente = ? AND a.id_annonce = v.id_annonce)";
					updateVente = con.prepareStatement(requete);
					updateVente.setInt(1, idVente);
					
					rs = updateVente.executeQuery();
					if(rs.next()){
						Integer idVendeur = rs.getInt("id_vendeur");
						Float note = rs.getFloat("vnote");
						
						requete = "UPDATE membre SET note = ?, nb_ventes=nb_ventes+1 WHERE id_membre=?";
						updateVente =con.prepareStatement(requete);
						updateVente.setFloat(1, note);
						updateVente.setInt(2, idVendeur);
						updateVente.executeUpdate();
					}
					
				} else {
					System.out.println("mauvais membre : "+session.getAttribute("user_id")+" | "+rs.getString("id_acheteur"));
					response.sendRedirect("home");
					return;
				}
			} catch (SQLException e) {
				e.printStackTrace();
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				try {
					con.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
		
		//Et on charge notre jsp :
		dis=request.getRequestDispatcher("acheter?action=voir_transaction&vente="+idVente);
		dis.forward(request,response);	
	}

}
